package com.kaili.common.util;

import com.kaili.common.pojo.entity.SysBaseMenu;
import com.kaili.common.pojo.entity.TreeEntity;

import java.util.ArrayList;
import java.util.List;

/**
 * 解析树形数据工具类
 *
 * @author lsw
 * @date 2017年5月29日
 */
public class TreeParserUtil{
    /**
     * 解析树形数据
     * @param topId
     * @param entityList
     * @return
     * @author lsw
     * @date 2017年5月29日
     */
    public static <E extends TreeEntity<E>> List<E> getTreeList(String topId, List<E> entityList) {
        List<E> resultList=new ArrayList<>();

        //获取顶层元素集合
        String parentId;
        for (E entity : entityList) {
            parentId=entity.getParentId();
            if(topId.equals(parentId)){
                resultList.add(entity);
            }
        }

        //获取每个顶层元素的子数据集合
        for (E entity : resultList) {
            entity.setChild(getSubList(entity.getId(),entityList));
        }

        return resultList;
    }


    /**
     * 格式化菜单树
     * @author:lsw
     * @Time: 19-1-18 下午2:02
     * @param treeList
     * @param menuAuthVo
     * @return
     */
    public static void menuFormat(List<SysBaseMenu> treeList, SysBaseMenu menuAuthVo){
        if(treeList==null){
            return;
        }
        List<String> permission=new ArrayList<>();
        for (SysBaseMenu authVo:treeList) {
            if(authVo.getChild()!=null){
                menuFormat(authVo.getChild(),authVo);
            }else{
                permission.add(authVo.getName());
            }
        }
        if(permission.size()>0){
            menuAuthVo.setPermission(permission);
            menuAuthVo.setChild(null);
        }
    }

    /**
     * 获取子数据集合
     * @param id
     * @param entityList
     * @return
     * @author lsw
     * @date 2017年5月29日
     */
    private  static  <E extends TreeEntity<E>> List<E> getSubList(String id, List<E> entityList) {
        List<E> childList=new ArrayList<>();
        String parentId;

        //子集的直接子对象
        for (E entity : entityList) {
            parentId=entity.getParentId();
            if(id.equals(parentId)){
                childList.add(entity);
            }
        }

        //子集的间接子对象
        for (E entity : childList) {
            entity.setChild(getSubList(entity.getId(), entityList));
        }

        //递归退出条件
        if(childList.size()==0){
            return null;
        }

        return childList;
    }
}
